// 属性包装器
// 作用: 用于批量封装属性

import UIKit

@propertyWrapper
struct DoubledValue {
  // 自定义一个属性,与要封装的属性同类型
  private var value: Int

  // MARK: 系统要求构造方法

  init(wrappedValue: Int) {
    // 自定义set逻辑
    value = wrappedValue * 2
  }

  // MARK: 系统要求属性

  var wrappedValue: Int {
    get { value }
    // 自定义set逻辑
    set { value = newValue * 2 }
  }
}

struct SomeStruct {
  @DoubledValue var a: Int
  @DoubledValue var b: Int
  @DoubledValue var c: Int
}

let s: SomeStruct = SomeStruct(a: 10, b: 20, c: 5)
print(s.a) // 20
print(s.b) // 20
print(s.c) // 20
